package com.czmh.etc.onlinepubsys.wx.services;


import com.czmh.etc.onlinepubsys.model.WeixinOAuthTokenVO;
import org.weixin4j.WeixinException;
import org.weixin4j.model.base.Token;
import org.weixin4j.model.js.Ticket;
import org.weixin4j.model.sns.SnsAccessToken;

import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
 * @ClassName
 * @Description 微信授权接口
 * 主要处理微信相关授权获取对应对应信息接口
 * @Author Eric
 * @Date 2019-06-08 00:41
 * @Version 1.0v
 */
public interface IWeixinOAuthService {


    /**
     * 用户同意授权，获取code
     *
     * @param appid       公众号的唯一标识ø
     * @param redirectUri 授权后重定向的回调链接地址， 请使用 urlEncode 对链接进行处理
     *                    scope为snsapi_base 此作用域：snsapi_base （不弹出授权页面，直接跳转，只能获取用户openid ）
     * @return
     */
    String getOAuth2CodeBySnsapiBase(String appid, String redirectUri) throws UnsupportedEncodingException;


    /**
     * 用户同意授权，获取code
     *
     * @param appid       公众号的唯一标识
     * @param redirectUri 授权后重定向的回调链接地址， 请使用 urlEncode 对链接进行处理
     *                    scope为snsapi_userinfo 此作用域：snsapi_userinfo （弹出授权页面，可通过openid拿到昵称、性别、所在地。并且， 即使在未关注的情况下，只要用户授权，也能获取其信息ø
     * @return
     */
    String getOAuth2CodeBySnsapiserinfo(String appid, String redirectUri) throws UnsupportedEncodingException;

    /**
     * 根据微信appi，secret、code获取微信token
     *
     * @param appid  微信appid
     * @param secret 微信密钥
     * @param code   code（code有时间限制）
     * @return
     */
    SnsAccessToken getOauthToken(String appid, String secret, String code) throws WeixinException;

    /**
     * 刷新用户token
     *
     * @param appId    appid
     * @param oldToken 旧token值
     * @return
     */
    SnsAccessToken refreshToken(String appId, String oldToken);

    /**
     * 获取全局token
     *
     * @return
     */
    Token getToken();

    /**
     * 检验授权凭证（access_token）是否有效
     *
     * @param accessToken accessToken
     * @param openId       openId
     * @return
     */
    boolean isAuth(String accessToken, String openId);

    /**
     * 获取JS-SDK使用权限签名算法的 getTicket
     *
     * @return
     */
    Ticket getTicket();


}
